iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0
Software Development

python 自學系列 第 10

python day10 (sets、iteration)

  • 分享至 

  • xImage
  •  

sets

sets 是一個沒有順序性而且元素不能重複的集合.
建立 set 的方式,可以使用 set(list).

>>> nums = set([1,2,3,4,2,5])
>>> type(nums)
<class 'set'>
>>> print(nums)
{1, 2, 3, 4, 5}

也可以使用 { } 包住元素建立.

>>> nums2 = {5,6,7,8,8,8}
>>> type(nums2)
<class 'set'>
>>> print(nums2)
{8, 5, 6, 7}

新增元素到 set.

>>> nums.add(10)
>>> nums.add(11)
>>> print(nums)
{1, 2, 3, 4, 5, 10, 11}

update 可以一次新增多個元素,重複的會被取代掉.

>>> nums.update([9,8,7])
>>> print(nums)
{1, 2, 3, 4, 5, 7, 8, 9, 10, 11}

使用 remove 移除元素.

>>> nums.remove(5)
>>> print(nums)
{1, 2, 3, 4, 7, 8, 9, 10, 11}

使用 union 相加兩個 set.

>>> nums1 = {1,2,3}
>>> nums2 = {3,4,5}
>>> nums = nums1.union(nums2)
>>> print(nums)
{1, 2, 3, 4, 5}

使用 clear 清空 set.

>>> nums.clear()
>>> print(nums)
set()

迭代 set 元素.

>>> for n in nums1:
...  print(n)
...
1
2
3

判斷元素是否存在 set.

>>> 3 in nums1
True
>>> 3 not in nums1
False

set 提供了一些運算子可對兩個 set 操作, union (|), intersection (&), difference (-), and xor (^).
差集

>>> nums = {0,1,2,3,4,5,6,7,8,9,10}
>>> odds = {1,3,5,7,9,11}
>>> even = nums - odds
>>> print(even)
{0, 2, 4, 6, 8, 10}

聯集

>>> print(even | odds)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}

交集

>>> print(nums & even)
{0, 2, 4, 6, 8, 10}

互斥或

>>> print(nums ^ even)
{1, 3, 5, 7, 9}

iteration

遞迴可以對某個集合,逐一取得裡面的元素做處理,使用 for.

>>> nums1 = {1,2,3}
>>> for n in nums1:
...  print(n)
...
1
2
3

也可以根據條件式來判斷迴圈是否需要一直執行,使用 while.

>>> sum = 3
>>> while sum > 0:
...  print(sum)
...  sum = sum - 1
...
3
2
1

使用 for range 可以印出連續的數組.

>>> for i in range(5):
...  print(i)
...
0
1
2
3
4
>>> for i in range(2,5):
...  print(i)
...
2
3
4

再利用 for range 來表示 index 逐一取得 list 的元素.

>>> names = ['Sam','Daniel','Jack']
>>> for i in range(len(names)):
...  print(i , names[i])
...
0 Sam
1 Daniel
2 Jack

更簡單的方式是使用 enumerate 就可以取得 index 跟 value 了.

>>> names = ['Sam','Daniel','Jack']
>>> for i,v in enumerate(names):
...  print(i,v)
...
0 Sam
1 Daniel
2 Jack

使用 break 停止迴圈.

>>> for i,v in enumerate(names):
...  if(i == 1):
...   break
...  print(i,v)
...
0 Sam

使用 continue 跳過該次迴圈.

>>> for i,v in enumerate(names):
...  if(i == 1):
...   continue
...  print(i,v)
...
0 Sam
2 Jack

由於 list 是 mutable 的,所以當在迭代 list 元素時,如果使用了 remove 後面元素的 index 也會往前了.所以就會導致例如下面的問題.

>>> names = ['Sam','Daniel','Jack','Allen','Bob']
>>> for i,name in enumerate(names):
...  if name not in ['Daniel','Jack']:
...   names.remove(name)
...  print(i,name)
...
0 Sam
1 Jack
2 Allen
>>> print(names)
['Daniel', 'Jack', 'Bob']

可以使用 copy 的方式,不要被已經被更動的 list 影響.

>>> names = ['Sam','Daniel','Jack','Allen','Bob']
>>> for i,name in enumerate(names.copy()):
...  if name not in ['Daniel','Jack']:
...   names.remove(name)
...  print(i,name)
...
0 Sam
1 Daniel
2 Jack
3 Allen
4 Bob
>>> print(names)
['Daniel', 'Jack']

使用 slice copy 的方式,也可以達到一樣的效果.

>>> names = ['Sam','Daniel','Jack','Allen','Bob']
>>> for i,name in enumerate(names[:]):
...  if name not in ['Daniel','Jack']:
...   names.remove(name)
...  print(i,name)
...
0 Sam
1 Daniel
2 Jack
3 Allen
4 Bob
>>> print(names)
['Daniel', 'Jack']

雙層迴圈

>>> for i in range(1,5):
...  for j in range(1,6,2):
...   print(i,j)
...
1 1
1 3
1 5
2 1
2 3
2 5
3 1
3 3
3 5
4 1
4 3
4 5

上一篇
python day9 (range、tuples)
下一篇
python day11 (dictionaries)
系列文
python 自學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言